/*!
 * \file ExecMocker.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 执行模拟器定义文件
 * 
 * \details 本文件定义了ExecMocker类，用于在WonderTrader回测框架中模拟执行单元
 *          执行模拟器负责模拟真实环境中的订单执行过程，包括：
 *          - 接收策略的交易信号并转换为订单
 *          - 使用撮合引擎模拟订单的成交过程  
 *          - 管理持仓和未完成订单
 *          - 提供历史数据和实时tick数据接口
 *          - 执行单元工厂管理和插件加载
 */
#pragma once
#include <sstream>
#include "HisDataReplayer.h"

#include "../Includes/ExecuteDefs.h"
#include "../Share/StdUtils.hpp"
#include "../Share/DLLHelper.hpp"
#include "MatchEngine.h"

USING_NS_WTP;

/*!
 * \class ExecMocker
 * \brief 执行模拟器类
 * 
 * \details ExecMocker是WonderTrader回测框架中的执行模拟器，负责模拟真实环境中的订单执行过程。
 *          主要功能包括：
 *          - 实现ExecuteContext接口，为策略提供执行环境
 *          - 实现IDataSink接口，接收历史数据回放的行情数据
 *          - 实现IMatchSink接口，处理撮合引擎的成交回报
 *          - 管理执行单元工厂，支持插件化的执行算法
 *          - 维护持仓信息和订单状态
 *          - 提供完整的交易日志记录
 * 
 * \note 此类是回测环境中的核心组件，确保回测结果的准确性和可靠性
 * \see ExecuteContext, IDataSink, IMatchSink, MatchEngine
 */
class ExecMocker : public ExecuteContext, public IDataSink, public IMatchSink
{
public:
	/*!
	 * \brief 构造函数
	 * \param replayer 历史数据回放器指针
	 */
	ExecMocker(HisDataReplayer* replayer);
	
	/*!
	 * \brief 析构函数
	 */
	virtual ~ExecMocker();

public:
	//////////////////////////////////////////////////////////////////////////
	//IMatchSink 撮合结果处理接口
	
	/*!
	 * \brief 处理成交回报
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param isBuy 是否买入方向
	 * \param vol 成交数量
	 * \param fireprice 触发价格
	 * \param price 成交价格
	 * \param ordTime 订单时间
	 */
	virtual void handle_trade(uint32_t localid, const char* stdCode, bool isBuy, double vol, double fireprice, double price, uint64_t ordTime) override;
	
	/*!
	 * \brief 处理订单状态更新
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param isBuy 是否买入方向
	 * \param leftover 剩余数量
	 * \param price 订单价格
	 * \param isCanceled 是否已撤销
	 * \param ordTime 订单时间
	 */
	virtual void handle_order(uint32_t localid, const char* stdCode, bool isBuy, double leftover, double price, bool isCanceled, uint64_t ordTime) override;
	
	/*!
	 * \brief 处理委托确认
	 * \param localid 本地订单ID
	 * \param stdCode 标准合约代码
	 * \param bSuccess 委托是否成功
	 * \param message 委托消息
	 * \param ordTime 订单时间
	 */
	virtual void handle_entrust(uint32_t localid, const char* stdCode, bool bSuccess, const char* message, uint64_t ordTime) override;

	//////////////////////////////////////////////////////////////////////////
	//IDataSink 数据接收接口
	
	/*!
	 * \brief 处理tick数据
	 * \param stdCode 标准合约代码
	 * \param curTick 当前tick数据
	 */
	virtual void handle_tick(const char* stdCode, WTSTickData* curTick) override;
	
	/*!
	 * \brief 处理时间调度
	 * \param uDate 日期(YYYYMMDD格式)
	 * \param uTime 时间(HHMMSS格式)
	 */
	virtual void handle_schedule(uint32_t uDate, uint32_t uTime) override;
	
	/*!
	 * \brief 处理初始化事件
	 */
	virtual void handle_init() override;

	/*!
	 * \brief 处理K线结束事件
	 * \param stdCode 标准合约代码
	 * \param period K线周期
	 * \param times K线倍数
	 * \param newBar 新的K线数据
	 */
	virtual void handle_bar_close(const char* stdCode, const char* period, uint32_t times, WTSBarStruct* newBar) override;

	/*!
	 * \brief 处理交易日开始事件
	 * \param curTDate 当前交易日期
	 */
	virtual void handle_session_begin(uint32_t curTDate) override;

	/*!
	 * \brief 处理交易日结束事件
	 * \param curTDate 当前交易日期
	 */
	virtual void handle_session_end(uint32_t curTDate) override;

	/*!
	 * \brief 处理回放完成事件
	 */
	virtual void handle_replay_done() override;

	//////////////////////////////////////////////////////////////////////////
	//ExecuteContext 执行上下文接口
	
	/*!
	 * \brief 获取历史tick数据
	 * \param stdCode 标准合约代码
	 * \param count 数据条数
	 * \param etime 结束时间，0表示最新时间
	 * \return tick数据切片
	 */
	virtual WTSTickSlice* getTicks(const char* stdCode, uint32_t count, uint64_t etime = 0) override;

	/*!
	 * \brief 获取最新tick数据
	 * \param stdCode 标准合约代码
	 * \return 最新tick数据
	 */
	virtual WTSTickData* grabLastTick(const char* stdCode) override;

	/*!
	 * \brief 获取持仓数量
	 * \param stdCode 标准合约代码
	 * \param validOnly 是否只返回有效持仓
	 * \param flag 持仓标志位(1-多头,2-空头,3-净持仓)
	 * \return 持仓数量
	 */
	virtual double getPosition(const char* stdCode, bool validOnly = true, int32_t flag = 3) override;

	/*!
	 * \brief 获取订单映射表
	 * \param stdCode 标准合约代码
	 * \return 订单映射表指针
	 */
	virtual OrderMap* getOrders(const char* stdCode) override;

	/*!
	 * \brief 获取未完成订单数量
	 * \param stdCode 标准合约代码
	 * \return 未完成数量
	 */
	virtual double getUndoneQty(const char* stdCode) override;

	/*!
	 * \brief 买入订单
	 * \param stdCode 标准合约代码
	 * \param price 订单价格
	 * \param qty 订单数量
	 * \param bForceClose 是否强制平仓
	 * \return 订单ID列表
	 */
	virtual OrderIDs buy(const char* stdCode, double price, double qty, bool bForceClose = false) override;

	/*!
	 * \brief 卖出订单
	 * \param stdCode 标准合约代码
	 * \param price 订单价格
	 * \param qty 订单数量
	 * \param bForceClose 是否强制平仓
	 * \return 订单ID列表
	 */
	virtual OrderIDs sell(const char* stdCode, double price, double qty, bool bForceClose = false) override;

	/*!
	 * \brief 撤销指定订单
	 * \param localid 本地订单ID
	 * \return 撤销是否成功
	 */
	virtual bool cancel(uint32_t localid) override;

	/*!
	 * \brief 撤销指定合约的订单
	 * \param stdCode 标准合约代码
	 * \param isBuy 是否买入方向
	 * \param qty 撤销数量，0表示全部撤销
	 * \return 撤销的订单ID列表
	 */
	virtual OrderIDs cancel(const char* stdCode, bool isBuy, double qty = 0) override;

	/*!
	 * \brief 写入日志
	 * \param message 日志消息
	 */
	virtual void writeLog(const char* message) override;

	/*!
	 * \brief 获取商品信息
	 * \param stdCode 标准合约代码
	 * \return 商品信息对象
	 */
	virtual WTSCommodityInfo* getCommodityInfo(const char* stdCode) override;
	
	/*!
	 * \brief 获取交易时段信息
	 * \param stdCode 标准合约代码
	 * \return 交易时段信息对象
	 */
	virtual WTSSessionInfo* getSessionInfo(const char* stdCode) override;

	/*!
	 * \brief 获取当前时间
	 * \return 当前时间戳(微秒)
	 */
	virtual uint64_t getCurTime() override;

public:
	/*!
	 * \brief 初始化执行模拟器
	 * \param cfg 配置参数
	 * \return 初始化是否成功
	 */
	bool	init(WTSVariant* cfg);

private:
	HisDataReplayer*	_replayer;		/*!< 历史数据回放器 */

	/*!
	 * \struct _ExecFactInfo
	 * \brief 执行单元工厂信息结构
	 */
	typedef struct _ExecFactInfo
	{
		std::string		_module_path;	/*!< 模块路径 */
		DllHandle		_module_inst;	/*!< 模块实例句柄 */
		IExecuterFact*	_fact;			/*!< 执行单元工厂指针 */
		FuncCreateExeFact	_creator;	/*!< 创建函数指针 */
		FuncDeleteExeFact	_remover;	/*!< 删除函数指针 */

		/*!
		 * \brief 构造函数
		 */
		_ExecFactInfo()
		{
			_module_inst = NULL;
			_fact = NULL;
		}

		/*!
		 * \brief 析构函数
		 */
		~_ExecFactInfo()
		{
			if (_fact)
				_remover(_fact);
		}
	} ExecFactInfo;
	
	ExecFactInfo	_factory;		/*!< 执行单元工厂信息 */

	ExecuteUnit*	_exec_unit;		/*!< 执行单元指针 */
	std::string		_code;			/*!< 合约代码 */
	std::string		_period;		/*!< 周期 */
	double			_volunit;		/*!< 成交单位 */
	int32_t			_volmode;		/*!< 成交模式 */

	double			_target;		/*!< 目标仓位 */

	double			_position;		/*!< 当前持仓 */
	double			_undone;		/*!< 未完成数量 */
	WTSTickData*	_last_tick;		/*!< 最新tick数据 */
	double			_sig_px;		/*!< 信号价格 */
	uint64_t		_sig_time;		/*!< 信号时间 */

	std::stringstream	_trade_logs;	/*!< 交易日志流 */
	uint32_t	_ord_cnt;			/*!< 订单计数 */
	double		_ord_qty;			/*!< 订单数量统计 */
	uint32_t	_cacl_cnt;			/*!< 撤销计数 */
	double		_cacl_qty;			/*!< 撤销数量统计 */
	uint32_t	_sig_cnt;			/*!< 信号计数 */

	std::string	_id;				/*!< 执行器ID */

	MatchEngine	_matcher;			/*!< 撮合引擎 */
};

